home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-06-22 | 4.2 KB | 246 lines | [TEXT/CWIE] |
- // patches.c
-
- #include <A4Stuff.h>
-
- #include "main.h"
- #include "patches.h"
-
-
- extern InitGrafProc oldInitGraf;
- extern Pack8Proc oldPack8;
- extern MenuSelectProc oldMenuSelect;
- extern MenuKeyProc oldMenuKey;
- extern SpecialHandlerProc shpChainProc;
-
- extern Boolean igpatched;
-
-
- ////////////////////////////////////////////////////////////
-
-
- void PatchInitGraf( void )
- {
- short trap = _InitGraf;
-
- oldInitGraf = (InitGrafProc)
- NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- NSetTrapAddress((UniversalProcPtr) MyInitGraf,
- trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- }
-
-
-
-
- pascal void MyInitGraf( void *globalPtr )
- {
- InitGrafProc localIGCopy;
- EnterCodeResource();
- if (igpatched) goto skip;
-
- // make sure we're ok to run
- if ( *(LMGetCurApName())!=(-1) && *(LMGetFinderName())!=(-1) &&
- !EqualString( LMGetFinderName(), LMGetCurApName(), true, true ) )
- goto skip;
-
- // install our ae hooks
- InstallAEHooks();
-
- // install finder patches
- PatchPack8();
- PatchMenuSelect();
- PatchMenuKey();
- InstallBlankNotification();
-
- // and make sure we only do this once
- igpatched = true;
-
- skip:
- localIGCopy = oldInitGraf;
- ExitCodeResource();
- (*localIGCopy) ( globalPtr );
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void PatchMenuSelect( void )
- {
- short trap = _MenuSelect;
-
- oldMenuSelect = (MenuSelectProc)
- NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- NSetTrapAddress((UniversalProcPtr) MyMenuSelect,
- trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- }
-
-
-
-
- void PatchMenuKey( void )
- {
- short trap = _MenuKey;
-
- oldMenuKey = (MenuKeyProc)
- NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- NSetTrapAddress((UniversalProcPtr) MyMenuKey,
- trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- }
-
-
-
- void PatchPack8( void )
- {
- short trap = _Pack8;
-
- oldPack8 = (Pack8Proc)
- NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- NSetTrapAddress((UniversalProcPtr) MyPack8,
- trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- }
-
-
-
-
-
- /*
- 4 bytes keyword
- 4 bytes shp
- 2 bytes isSysHandler
- 4 bytes returnaddr
- 4 <--- link ptr
- */
-
- asm pascal short MyPack8(register short selector:__D0,AEKeyword keyword, SpecialHandlerProc shp,Boolean isSysHandler)
- {
- long olda4;
- long oldd5;
-
- fralloc
- move.l a4, olda4
- move.l d5, oldd5
- move.l d0,d5
- jsr SetCurrentA4
- move.l d5,d0
-
- cmpi.w #0x500,d0 // installspecialhandler
- beq callspechandlerproc
- cmpi.w #0x501,d0 // removespecialhandler
- beq callspechandlerproc
- cmpi.w #0x52d,d0 // getspecialhandler
- beq callspechandlerproc
-
- cmpi.w #0xd17,d0 // aesend
- beq callaesendproc
-
- bra.s callthru
-
- callaesendproc:
- move.l d5,d0
- move.l 8(a6),-(sp) // filterproc
- move.l 12(a6),-(sp) // idleproc
- move.l 16(a6),-(sp) // timeout
- move.w 20(a6),-(sp) // send priority
- move.l 22(a6),-(sp) // send mode
- move.l 26(a6),-(sp) // reply
- move.l 30(a6),-(sp) // theevent
-
- jsr MyAESend
- lea 26(sp),sp
- bra.s callthru
-
- callspechandlerproc:
- move.l d5,d0
- MOVE.W 8(A6),-(SP)
- MOVE.L 10(A6),-(SP)
- MOVE.L 14(A6),-(SP)
-
- jsr MyPack8Helper
- LEA 10(SP),SP
- tst.w d0
- bne callthru
-
- nevermind:
- MOVEQ #0,D0
-
- move.l olda4, a4
- move.l oldd5, d5
- frfree
-
- MOVE.L (SP)+,A0
- LEA 10(SP),SP
- JMP (A0)
-
- callthru:
- move.l oldPack8,a0
- move.l d5, d0
- move.l olda4, a4
- move.l oldd5, d5
- frfree
- jmp (a0)
-
- }
-
-
-
- short MyPack8Helper( AEKeyword keyword, SpecialHandlerProc shp, Boolean isSysHandler,
- short selector:__D0 ):__D0
- {
- Boolean suppress = false;
- EnterCodeResource();
-
- switch(selector)
- {
- case 0x500: // install
- if ( (keyword == keyPreDispatch) && !isSysHandler)
- {
- DebugStr( "\psomeone's installing a phac handler...." );
- shpChainProc = shp;
- suppress = true;
- }
- break;
-
- case 0x501: // remove
- if ( (keyword == keyPreDispatch) && !isSysHandler)
- {
- DebugStr( "\psomeone's removing a phac handler...." );
- if ( shp == shpChainProc)
- shpChainProc = nil;
- suppress = true;
- }
- break;
-
- case 0x52d: // get
- if ( (keyword == keyPreDispatch) && !isSysHandler)
- {
- DebugStr( "\psomeone's getting the phac handler...." );
- *((SpecialHandlerProc*)shp) = shpChainProc;
- suppress = true;
- }
- break;
- }
-
- ExitCodeResource();
-
- if (suppress) return 0;
- else return selector;
- }
-
-
-
-
-
-
-
-
-
-